/*
 * Copyright 2002-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.context.annotation;

/**
 * Enumeration of the type filters that may be used in conjunction with
 * {@link ComponentScan @ComponentScan}.
 *
 * @author Mark Fisher
 * @author Juergen Hoeller
 * @author Chris Beams
 * @since 2.5
 * @see ComponentScan
 * @see ComponentScan#includeFilters()
 * @see ComponentScan#excludeFilters()
 * @see org.springframework.core.type.filter.TypeFilter
 */
public enum FilterType {

	/**
	 * Filter candidates marked with a given annotation.
	 * @see org.springframework.core.type.filter.AnnotationTypeFilter
	 *
	 * 基于注解过滤
	 * 当选择这种过滤类型时，value属性需要指定一个注解类。Spring 在扫描组件时，会检查每个类是否带有指定的注解。
	 * 只有带有该注解的类才会被包含在扫描范围内。这种方式在你有自定义注解用于标记特定功能的组件时非常有用。
	 * 例如，你定义了一个@MyCustomAnnotation用于标记所有的缓存服务组件。通过设置includeFilters为
	 * @Filter(type = FilterType.ANNOTATION, value = MyCustomAnnotation.class)，
	 * 就可以确保只有带有这个注解的缓存服务组件会被扫描并注册为 Spring 容器中的 Bean。
	 */
	ANNOTATION,

	/**
	 * Filter candidates assignable to a given type.
	 * @see org.springframework.core.type.filter.AssignableTypeFilter
	 *
	 * 基于类型继承过滤
	 * 对于这种类型，value属性应指定一个类。扫描过程中，Spring 会检查每个类是否是value所指定类的子类或者实现类（如果value是接口）。
	 * 例如，你有一个抽象的BaseService类，所有的业务服务类都继承自这个类。你可以设置includeFilters为
	 * @Filter(type = FilterType.ASSIGNABLE_TYPE, value = BaseService.class)，这样只有继承自BaseService的类才会被扫描，
	 * 这有助于将组件扫描范围聚焦到特定的业务服务组件集合上。
	 */
	ASSIGNABLE_TYPE,

	/**
	 * Filter candidates matching a given AspectJ type pattern expression.
	 * @see org.springframework.core.type.filter.AspectJTypeFilter
	 *
	 * 基于 AspectJ 表达式过滤
	 * 使用 AspectJ 表达式来确定哪些组件应该被包含。AspectJ 表达式功能强大，可以基于类的各种属性（如包名、类名、方法签名等）进行复杂的匹配。
	 * 例如，你可以使用表达式"com.example.demo..*Service"来包含所有在com.example.demo包及其子包下名称以Service结尾的类。
	 * 不过，这种方式需要对 AspectJ 表达式有一定的了解，并且在配置时要注意表达式的准确性。
	 */
	ASPECTJ,

	/**
	 * Filter candidates matching a given regex pattern.
	 * @see org.springframework.core.type.filter.RegexPatternTypeFilter
	 *
	 * 基于正则表达式过滤
	 * 通过正则表达式来匹配类的全限定名，从而确定是否包含该类。例如，如果你想扫描所有以com.example.demo.api开头且类名中包含Controller的类，
	 * 可以使用正则表达式"^com.example.demo.api.*Controller"作为value属性的值（同时type设置为FilterType.REGEX）。
	 * 正则表达式提供了一种灵活的方式来定义复杂的匹配规则，但也需要谨慎使用，以确保正确的类被包含。
	 */
	REGEX,

	/** Filter candidates using a given custom
	 * {@link org.springframework.core.type.filter.TypeFilter} implementation.
	 *
	 * 基于自定义过滤器过滤
	 * 这种类型允许你实现完全自定义的过滤器。你需要创建一个实现了org.springframework.core.type.filter.TypeFilter接口的类。
	 * 这个接口有一个match方法，在扫描每个类时，Spring 会调用这个方法来判断是否应该包含该类。
	 * 例如，你可以在match方法中根据类的自定义属性（如通过反射获取类中的某个字段值或者方法返回值）来决定是否包含该类。
	 * 这种方式提供了最大程度的灵活性，但也需要更多的编码工作来实现自定义过滤器。
	 */
	CUSTOM

}
